|
Date : 9 septembre 1991 Protection : MOT DE PASSE Programme : CONTINUM / ALPHA WAVES Outils : SOFT-ICE V2.50, MASM, LINK/TINY Fichier : FREDDY_F.COM ( personnel ) Temps pass� : 1 HEURE Soci�t� : INFOGRAMMES Divers : Compact� par un compacteur maison Origine : INDONESIE Num�ro : 140 Ce doit �tre la quatri�me ou cinqui�me fois que je m'y remets en esp�rant trouver une piste. C'est le cas aujourd'hui. Les caract�res sont demand�s en assembleur. La touche ENTER est test�e en CS:7884. CS=1A8D CS:7884 3D1C00 CMP AX,1C CS:7887 7403 JZ 788C CS:7889 E9E1FE JMP 776D CS:788C 16 PUSH SS CS:788D 8D46F6 LEA AX,[BP-OA] CS:7890 50 PUSH AX CS:7891 E8FAAF CALL 288E Peut apr�s ce CALL on arrive � un RET o� l'on teste le contenu de AX avec 0004. Une bonne r�ponse y fait effectivement apparaitre la valeur 0004 tandisqu'une mauvaise un nombre entre 0 et 3. En fait j'ai d�couvert plus tard que ce nombre correspondait au nombre de chiffres corrects. Le code en demande quatre. En for�ant 0004 dans AX le jeu a l'air de vouloir se d�rouler mais tout est m�lang� et il se plante un peu plus tard. Il est donc n�cessaire de trouver qui est l'auteur d'un quatre en AX avant le RET. Cel� se passe dans le CALL 288E. Cette routine teste les chiffres rentr�s et incr�mente DX � chaque fois qu'un des quatre chiffres correspond au code demand�. Puis DX est MOV� dans AX et l'on sort du CALL. Dans cette routine on trouve deux tests qui forc�s incr�mentent bien DX � quatre. Premier test dans le CALL 288E; CS:28CD BBD22A MOV BX,2AD2 CS:28D0 42 INC DX ; DX est incr�ment�. CS:28D1 3AE1 CMP AH,CL CS:28D3 750F JNZ 28E4 ; Saut � supprimer par des NOP. Second test dans le CALL 288E; CS:28FC 42 INC DX CS:28FD BBD22A MOV BX,2AD2 CS:2900 3AE5 CMP AH,CH CS:2902 750C JNZ 2910 ; Saut � supprimer par des NOP. Evidemment cette chaine est cod�e, mais ce n'est plus un probl�me puisqu'il existe toujours une solution. Le principal est de trouver ce qu'il faut modifier, apr�s ce n'est plus qu'un choix � faire en fonction des allergies du programme et/ou des moyens dont on dispose. Ici comme le programme est compact� par un compacteur autre que les classiques LZEXE/PKLITE/EXEPACK la solution du d�tournement d'INT s'impose d'elle m�me. Mais j'�vite la routine r�sidente ( certain programme font des rejets - voir SUPER_C.DEP ) il est plus �l�gant de faire un programme qui appelle � son tour le programme � modifier. J'ai donc �crit trois petits lan�eurs ( FRANCAIS, ALLEMAND, ANGLAIS ) puisque le programme charge au choix un de ces programmes en fonction de la langue choisie. Ci-dessous la version FRANCAISE seule est list�e; ; PATCH POUR LE PROGRAMME CONTINUM en FRANCAIS. ; DETOURNEMENT DE L'INT 21 SOUS FONCTION 42. adr_ip1 equ 28d3h ; IP du premier saut � annuler. adr_ip2 equ 2902h ; IP du second saut. patch equ 9090h ; Deux NOP pour �craser les JNZ. seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a org 100h sto proc far start: jmp init ; r�duire la m�moire et d�placer la db 90h ; pile plus pr�s. nom_prg db 'alpha_f.com',0,0 ; 12 car max + nul paramet dw 0 ; M�me bloc d'environnement. ENVIR dw 0 ; Les param�tres de la ligne de data_3 dw 0 ; commande sont recopi�s ici puis FCB_1 dw 0 ; transmis au programme fils. ( 80h ) data_5 dw 0 FCB_2 dw 0 data_7 dw 0 sauve_SP dw 0 sauve_SS dw 0 data_9 dw 0, 0 drap equ 0 ;------------------------------ PROGRAMME PERE ------------------------------ loc_1: mov sauve_SP,sp mov sauve_SS,ss mov ax,80h mov ENVIR,ax ; Ligne de commande... mov data_3,ds mov ax,5Ch ; Premier FCB ( inutilis� ) mov FCB_1,ax mov data_5,ds mov ax,6Ch ; Second FCB ( inutilis� ) mov FCB_2,ax mov data_7,ds mov ah,35h mov al,21h int 21h ; get intrpt vector al in es:bx mov cs:data_9,bx mov word ptr cs:data_9+2,es mov ah,25h mov al,21h lea dx,cs:[int21] ; Load effective addr int 21h ; set intrpt vector al to ds:dx lea dx,cs:[nom_prg] ; Load effective addr push ds pop es lea bx,cs:[paramet] ; Load effective addr mov al,0 mov ah,4Bh int 21h ; Appel du programme fils. ; run progm @ds:dx, parm @es:bx mov sp,sauve_SP mov ss,sauve_SS mov ah,25h mov al,21h mov dx,cs:data_9 mov ds,word ptr cs:data_9+2 int 21h ; set intrpt vector al to ds:dx mov ah,4dh int 21h mov ah,4Ch int 21h ; terminate with al=return code sto endp ;---------------------------- int 21 d�tourn�e ----------------------------- int_21h_entry proc far int21: push ax push ds push bp push cx pushf ; Push flags cmp byte ptr ds:[drap],1 ; Je regarde si c'est fait. jz loc_2 cmp ah,42h ; Sous- fonction 01 jne loc_2 ; Jump if not equal mov ax,sp mov bp,ds mov cx,20 ; On pope 20 fois pour trouver incr: pop ds ; le bon segment. dec cx jz s cmp word ptr ds:[adr_ip1],0F75h ; Si ok on patche. jnz incr ; Sinon on incr�mente. mov word ptr ds:[adr_ip1],patch mov word ptr ds:[adr_ip2],patch mov ds,bp mov byte ptr ds:[drap],1 ; On y revient plus. s: mov sp,ax loc_2: popf pop cx pop bp pop ds pop ax jmp dword ptr cs:data_9 int_21h_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ init: mov ah,4ah mov bx,offset fin ; Fin du programme en BX. mov cl,4 ; Divis� par 4 pour avoir des paragraphes. shr bx,cl inc bx ; On en rajoute un par s�curit�. int 21h ; Execution de la fonction 4Ah. mov sp,offset fin ; on d�place la pile en "fin" car elle est jmp loc_1 ; plac�e en FFFE dans un programme COM. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ ; Ces donn�es ne servent qu'� r�server de la place pour la pile et seront ; d�truites lorsque cette derni�re descendra... db 90 dup (20h) db "Bonjour FREDDY_SOFT vous salue" db 50 dup (20h) db "Ceci est mon 140�me patche" db 54 dup (20h) db "Demandez-moi la BIBLE du PIRATE" db 49 dup (20h) db "On peut me joindre au 89 50 10 41" db 47 dup (20h) db "Un de mes disciple s'y trouve...." fin equ this byte ; ici le sommet de la pile, SP seg_a ends end start |